ì ë€ëŠ íì ì¶ë¡ ì ë©ì»€ëìŠ, ì¥ì , ë€ìí íë¡ê·žëë° ìžìŽììì íì©ë²ì ì¬ìžµì ìŒë¡ í구íë©°, ìë íì ê²°ì 곌 ìœë íšìšì± í¥ìì ìŽì ì ë§ì¶¥ëë€.
ì ë€ëŠ íì ì¶ë¡ ì¬ìžµ ë¶ì: ìë íì ê²°ì ë©ì»€ëìŠ
ì ë€ëŠ íì ì¶ë¡ ì ìœë륌 ëšìííê³ íì ìì ì±ì í¥ììí€ë íë íë¡ê·žëë° ìžìŽì ê°ë ¥í êž°ë¥ì ëë€. 컎íìŒë¬ê° ì ë€ëŠ ë§€ê°ë³ìê° ì¬ì©ëë 컚í ì€ížë¥Œ êž°ë°ìŒë¡ íì ì ìëìŒë¡ ì¶ë¡ íê² íì¬, ëª ìì ìž íì íêž°ì íìì±ì ì€ìŽê³ ìœë ê°ë ì±ì í¥ììíµëë€.
ì ë€ëŠ íì ì¶ë¡ ìŽë 묎ììžê°?
íµì¬ì ìŒë¡, ì ë€ëŠ íì ì¶ë¡ ì ìë íì ê²°ì ë©ì»€ëìŠì ëë€. ì ë€ëŠ(ë§€ê°ë³ìì ë€íì±ìŽëŒê³ ë íš)ì ì¬ì©í멎 í¹ì íì ì ìœë§€ìŽì§ ìê³ ë€ìí íì ì ëíŽ ìëíë ìœë륌 ìì±í ì ììµëë€. ì륌 ë€ìŽ, ì ì, 묞ììŽ ëë ë€ë¥ž ë°ìŽí° íì ì ëŽì ì ìë ì ë€ëŠ ëŠ¬ì€ížë¥Œ ë§ë€ ì ììµëë€.
íì ì¶ë¡ ìŽ ìë€ë©Ž, ì ë€ëŠ íŽëì€ë ë©ìë륌 ì¬ì©í ë íì ë§€ê°ë³ì륌 ëª ìì ìŒë¡ ì§ì íŽìŒ í©ëë€. ìŽë í¹í ë³µì¡í íì ê³ìžµì ë€ë£° ë ì¥í©íê³ ë²ê±°ë¡ìì§ ì ììµëë€. íì ì¶ë¡ ì 컎íìŒë¬ê° ì ë€ëŠ ìœëì ì ë¬ë ìžì륌 êž°ë°ìŒë¡ íì ë§€ê°ë³ì륌 ì¶ë¡ íê² íšìŒë¡ìš ìŽë¬í 볎ìŒë¬íë ìŽížë¥Œ ì ê±°í©ëë€.
ì ë€ëŠ íì ì¶ë¡ ì ì¥ì
- 볎ìŒë¬íë ìŽíž ê°ì: ëª ìì ìž íì íêž°ê° ì€ìŽë€ìŽ ìœëê° ë 깚ëíê³ ê°ê²°íŽì§ëë€.
- ê°ë ì± í¥ì: 컎íìŒë¬ê° íì ê²°ì ì ì²ëЬíë¯ë¡ íë¡ê·žëëšžë ë¡ì§ì ë ì§ì€í ì ììŽ ìœë륌 ìŽíŽíêž° ì¬ìì§ëë€.
- íì ìì ì± ê°í: 컎íìŒë¬ë ì¬ì í íì ê²ì¬ë¥Œ ìííì¬ ì¶ë¡ ë íì ìŽ ìì íì 곌 ìŒì¹íëì§ íìží©ëë€. ìŽë ì ì¬ì ìž íì ì€ë¥ë¥Œ ë°íììŽ ìë 컎íìŒ íìì ì¡ìë ëë€.
- ìœë ì¬ì¬ì©ì± ìŠê°: ì ë€ëŠê³Œ íì ì¶ë¡ ì ê²°í©ì ë€ìí ë°ìŽí° íì 곌 íšê» ìëí ì ìë ì¬ì¬ì© ê°ë¥í 컎í¬ëíž ìì±ì ê°ë¥íê² í©ëë€.
ì ë€ëŠ íì ì¶ë¡ ì ìë ì늬
ì ë€ëŠ íì ì¶ë¡ ì ì¬ì©ëë 구첎ì ìž ìê³ ëŠ¬ìŠê³Œ êž°ì ì íë¡ê·žëë° ìžìŽì ë°ëŒ ë€ëŠ ëë€. ê·žë¬ë ìŒë°ì ìž ìì¹ì ëìŒí©ëë€. 컎íìŒë¬ë ì ë€ëŠ íŽëì€ë ë©ìëê° ì¬ì©ëë 컚í ì€ížë¥Œ ë¶ìíê³ ë€ì ì 볎륌 êž°ë°ìŒë¡ íì ë§€ê°ë³ì륌 ì¶ë¡ íë €ê³ ìëí©ëë€:
- ì ë¬ë ìžì: ì ë€ëŠ ë©ìëë ìì±ìì ì ë¬ë ìžìì íì .
- ë°í íì : ì ë€ëŠ ë©ìëì ìì ë°í íì .
- í ë¹ ì»ší ì€íž: ì ë€ëŠ ë©ìëì ê²°ê³Œê° í ë¹ëë ë³ìì íì .
- ì ìœ ì¡°ê±Ž: ìì ë°ìŽëë ìží°íìŽì€ 구í곌 ê°ìŽ íì ë§€ê°ë³ìì ì ì©ë ì ìœ ì¡°ê±Ž.
컎íìŒë¬ë ìŽ ì 볎륌 ì¬ì©íì¬ ì ìœ ì¡°ê±Ž ì§í©ì 구ì¶í ë€ì, ìŽë¬í ì ìœ ì¡°ê±Žì íŽê²°íì¬ ëªšë 조걎ì ë§ì¡±íë ê°ì¥ 구첎ì ìž íì ì ê²°ì íë €ê³ ìëí©ëë€. ë§ìœ 컎íìŒë¬ê° íì ë§€ê°ë³ì륌 ê³ ì íê² ê²°ì í ì ìê±°ë ì¶ë¡ ë íì ìŽ ì ìœ ì¡°ê±Žê³Œ ìŒì¹íì§ ììŒë©Ž 컎íìŒ íì ì€ë¥ë¥Œ ë°ììíµëë€.
íë¡ê·žëë° ìžìŽë³ ìì
ëªëª ìžêž° ìë íë¡ê·žëë° ìžìŽìì ì ë€ëŠ íì ì¶ë¡ ìŽ ìŽë»ê² 구íëëì§ ìŽíŽë³Žê² ìµëë€.
Java
Javaë Java 5ìì ì ë€ëŠì ëì íê³ , íì ì¶ë¡ ì Java 7ìì í¥ìëììµëë€. ë€ì ìì 륌 ìŽíŽë³Žìžì:
List<String> names = new ArrayList<>(); // Java 7+ì íì
ì¶ë¡
names.add("Alice");
names.add("Bob");
// ì ë€ëŠ ë©ìë ìì:
public <T> T identity(T value) {
return value;
}
String result = identity("Hello"); // íì
ì¶ë¡ : Të String
Integer number = identity(123); // íì
ì¶ë¡ : Të Integer
첫 ë²ì§ž ììì ë€ìŽì몬ë ì°ì°ì <>ë 컎íìŒë¬ê° ë³ì ì ìžì êž°ë°ìŒë¡ ArrayListê° List<String>ìŽìŽìŒ íšì ì¶ë¡ íê² í©ëë€. ë ë²ì§ž ìììë identity ë©ìëì íì
ë§€ê°ë³ì Tì íì
ìŽ ë©ìëì ì ë¬ë ìžì륌 êž°ë°ìŒë¡ ì¶ë¡ ë©ëë€.
C++
C++ì ì ë€ëŠ íë¡ê·žëë°ì ìíŽ í í늿ì íì©í©ëë€. C++ìë Javaë C#곌 ê°ì ë°©ìì ëª ìì ìž "íì ì¶ë¡ "ìŽ ìì§ë§, í í늿 ìžì ì¶ë¡ ìŽ ì ì¬í êž°ë¥ì ì ê³µí©ëë€:
template <typename T>
T identity(T value) {
return value;
}
int main() {
auto result = identity(42); // í
í늿 ìžì ì¶ë¡ : Të int
auto message = identity("C++ Template"); // í
í늿 ìžì ì¶ë¡ : Të const char*
return 0;
}
ìŽ C++ ìì ìì C++11ì ëì
ë auto í€ìëë í
í늿 ìžì ì¶ë¡ 곌 ê²°í©ëìŽ ì»ŽíìŒë¬ê° identity í
í늿 íšìì ë°í íì
ì êž°ë°ìŒë¡ resultì message ë³ìì íì
ì ì¶ë¡ íê² í©ëë€.
TypeScript
JavaScriptì ìì ì§í©ìž TypeScriptë ì ë€ëŠê³Œ íì ì¶ë¡ ì ê°ë ¥íê² ì§ìí©ëë€:
function identity<T>(value: T): T {
return value;
}
let result = identity("TypeScript"); // íì
ì¶ë¡ : Të string
let number = identity(100); // íì
ì¶ë¡ : Të number
// ì ë€ëŠ ìží°íìŽì€ ìì:
interface Box<T> {
value: T;
}
let box: Box<string> = { value: "Inferred String" }; // ëª
ìì ìž íì
íêž° íì ìì
TypeScriptì íì
ìì€í
ì íì
ì¶ë¡ ì í¹í ê°í©ëë€. ì ììì resultì numberì íì
ì identity íšìì ì ë¬ë ìžì륌 êž°ë°ìŒë¡ ì ííê² ì¶ë¡ ë©ëë€. Box ìží°íìŽì€ë ì ë€ëŠ ìží°íìŽì€ì íì
ì¶ë¡ ìŽ ìŽë»ê² ìëíëì§ ë³Žì¬ì€ëë€.
C#
C#ì ì ë€ëŠê³Œ íì ì¶ë¡ ì Javaì ì ì¬íë©°, ìê°ìŽ ì§ëšì ë°ëŒ ê°ì ëììµëë€:
using System.Collections.Generic;
public class Example {
public static void Main(string[] args) {
List<string> names = new List<>(); // íì
ì¶ë¡
names.Add("Charlie");
// ì ë€ëŠ ë©ìë ìì:
string message = GenericMethod("C# Generic"); // íì
ì¶ë¡
int value = GenericMethod(55);
System.Console.WriteLine(message + " " + value);
}
public static T GenericMethod<T>(T input) {
return input;
}
}
List<string> names = new List<>(); ëŒìžì Javaì ëìŒí ë€ìŽì몬ë ì°ì°ì 구묞ì ì¬ì©íì¬ íì
ì¶ë¡ ì 볎ì¬ì€ëë€. GenericMethodë 컎íìŒë¬ê° ë©ìëì ì ë¬ë ìžì륌 êž°ë°ìŒë¡ íì
ë§€ê°ë³ì T륌 ìŽë»ê² ì¶ë¡ íëì§ ë³Žì¬ì€ëë€.
Kotlin
Kotlinì ì ë€ëŠê³Œ íì ì¶ë¡ ì íë¥íê² ì§ìíì¬ ë§€ì° ê°ê²°í ìœë륌 ìì±í ì ìê² í©ëë€:
fun <T> identity(value: T): T {
return value
}
val message = identity("Kotlin Generics") // íì
ì¶ë¡ : Të String
val number = identity(200) // íì
ì¶ë¡ : Të Int
// ì ë€ëŠ ëŠ¬ì€íž ìì:
val numbers = listOf(1, 2, 3) // íì
ì¶ë¡ : List<Int>
val strings = listOf("a", "b", "c") // íì
ì¶ë¡ : List<String>
Kotlinì íì ì¶ë¡ ì ë§€ì° ê°ë ¥í©ëë€. ë³ìì í ë¹ë ê°ì êž°ë°ìŒë¡ ë³ìì íì ì ìëìŒë¡ ì¶ë¡ íì¬ ëª ìì ìž íì íêž°ì íìì±ì ì€ì ëë€. ìì ë ì ë€ëŠ íšì ë° ì»¬ë ì 곌 íšê» ìŽë»ê² ìëíëì§ ë³Žì¬ì€ëë€.
Swift
Swiftì íì ì¶ë¡ ìì€í ì ìŒë°ì ìŒë¡ ë§€ì° ì êµí©ëë€:
func identity<T>(value: T) -> T {
return value
}
let message = identity("Swift Type Inference") // íì
ì¶ë¡ : String
let number = identity(300) // íì
ì¶ë¡ : Int
// ë°°ìŽ ìì:
let intArray = [1, 2, 3] // íì
ì¶ë¡ : [Int]
let stringArray = ["a", "b", "c"] // íì
ì¶ë¡ : [String]
Swiftë ì ìì ìì 볌 ì ìë¯ìŽ ë³ìì 컬ë ì ì íì ì ìííê² ì¶ë¡ í©ëë€. ìŽë ëª ìì ìž íì ì ìžì ìì ì€ì¬ 깚ëíê³ ê°ë ì± ëì ìœë륌 ê°ë¥íê² í©ëë€.
Scala
Scalaì íì ì¶ë¡ ëí ë§€ì° ë°ì íì¬ êŽë²ìí ìë늬ì€ë¥Œ ì§ìí©ëë€:
def identity[T](value: T): T = value
val message = identity("Scala Generics") // íì
ì¶ë¡ : String
val number = identity(400) // íì
ì¶ë¡ : Int
// ì ë€ëŠ ëŠ¬ì€íž ìì:
val numbers = List(1, 2, 3) // íì
ì¶ë¡ : List[Int]
val strings = List("a", "b", "c") // íì
ì¶ë¡ : List[String]
Scalaì íì ìì€í ì íšìí íë¡ê·žëë° êž°ë¥ê³Œ ê²°í©íì¬ íì ì¶ë¡ ì êŽë²ìíê² íì©í©ëë€. ìì ë ì ë€ëŠ íšì ë° ë¶ë³ 늬ì€ížììì ì¬ì©ì 볎ì¬ì€ëë€.
íê³ ë° ê³ ë €ì¬í
ì ë€ëŠ íì ì¶ë¡ ì ìë¹í ìŽì ì ì ê³µíì§ë§ íê³ë ììµëë€:
- ë³µì¡í ìë늬ì€: ìŒë¶ ë³µì¡í ìë늬ì€ììë 컎íìŒë¬ê° íì ì ì¬ë°ë¥Žê² ì¶ë¡ íì§ ëª»íì¬ ëª ìì ìž íì íêž°ê° íìí ì ììµëë€.
- 몚ížì±: 컎íìŒë¬ê° íì ì¶ë¡ 곌ì ìì 몚ížì±ì ë°ê²¬í멎 컎íìŒ íì ì€ë¥ë¥Œ ë°ììíµëë€.
- ì±ë¥: íì ì¶ë¡ ì ìŒë°ì ìŒë¡ ë°íì ì±ë¥ì í° ìí¥ì 믞ì¹ì§ ìì§ë§, í¹ì 겜ì°ìë 컎íìŒ ìê°ì ìŠê°ìí¬ ì ììµëë€.
ìŽë¬í íê³ë¥Œ ìŽíŽíê³ íì ì¶ë¡ ì ì ì€íê² ì¬ì©íë ê²ìŽ ì€ìí©ëë€. ìì¬ì€ë¬ìž ëë ëª ìì ìž íì íꞰ륌 ì¶ê°í멎 ìœëì ëª íì±ì ëìŽê³ ìêž°ì¹ ìì ëìì ë°©ì§í ì ììµëë€.
ì ë€ëŠ íì ì¶ë¡ ì¬ì©ì ìí ëªšë² ì¬ë¡
- ì€ëª ì ìž ë³ì ìŽëŠ ì¬ì©: ì믞 ìë ë³ì ìŽëŠì 컎íìŒë¬ê° ì¬ë°ë¥ž íì ì ì¶ë¡ íë ë° ëìì ì£Œê³ ìœë ê°ë ì±ì í¥ììí¬ ì ììµëë€.
- ìœë ê°ê²°ì± ì ì§: ìœëì ë¶íìí ë³µì¡ì±ì íŒíìžì. ìŽë íì ì¶ë¡ ì ë ìŽë µê² ë§ë€ ì ììµëë€.
- íìí ë ëª ìì íì íêž° ì¬ì©: 컎íìŒë¬ê° íì ì ì¬ë°ë¥Žê² ì¶ë¡ íì§ ëª»íê±°ë ìœëì ëª íì±ì í¥ììí¬ íìê° ìì ë ëª ìì ìž íì íꞰ륌 죌ì íì§ ë§ìžì.
- ì² ì í í ì€íž: ìœëê° ì² ì í í ì€ížëìëì§ íìžíì¬ ì»ŽíìŒë¬ê° ì¡ì§ 못í ì ìë ì ì¬ì ìž íì ì€ë¥ë¥Œ ì¡ìëŽìžì.
íšìí íë¡ê·žëë°ììì ì ë€ëŠ íì ì¶ë¡
ì ë€ëŠ íì ì¶ë¡ ì íšìí íë¡ê·žëë° íšë¬ë€ììì ì€ìí ìí ì í©ëë€. íšìí ìžìŽë ì¢ ì¢ ë¶ë³ ë°ìŽí° 구조ì ê³ ì°š íšìì í¬ê² ì졎íë©°, ìŽë ì ë€ëŠê³Œ íì ì¶ë¡ ìŽ ì ê³µíë ì ì°ì±ê³Œ íì ìì ì±ìŒë¡ë¶í° í° ìŽì ì ì»ìµëë€. HaskellìŽë Scalaì ê°ì ìžìŽë íšìí í¹ì±ì íµì¬ìŽ ëë ê°ë ¥í íì ì¶ë¡ ë¥ë ¥ì 볎ì¬ì€ëë€.
ì륌 ë€ìŽ, Haskellììë íì ìì€í ìŽ ì¢ ì¢ ëª ìì ìž íì ìê·žëì² ììŽë ë³µì¡í ííìì íì ì ì¶ë¡ í ì ììŽ ê°ê²°íê³ ííë ¥ ìë ìœë륌 ê°ë¥íê² í©ëë€.
ê²°ë¡
ì ë€ëŠ íì ì¶ë¡ ì íë ìíížìšìŽ ê°ë°ì ììŽ ê°ì¹ ìë ë구ì ëë€. ìœë륌 ëšìííê³ , íì ìì ì±ì ê°ííë©°, ìœë ì¬ì¬ì©ì±ì í¥ììíµëë€. ê°ë°ìë€ì íì ì¶ë¡ ì ìë ë°©ìì ìŽíŽíê³ ëªšë² ì¬ë¡ë¥Œ ë°ëŠìŒë¡ìš êŽë²ìí íë¡ê·žëë° ìžìŽìì ë ê²¬ê³ íê³ ì ì§ë³Žìíêž° ì¬ìŽ ìíížìšìŽë¥Œ ë§ë€ ì ììµëë€. íë¡ê·žëë° ìžìŽê° ê³ìíŽì ë°ì íšì ë°ëŒ, ëì± ì êµí íì ì¶ë¡ ë©ì»€ëìŠìŽ ë±ì¥íì¬ ê°ë° 곌ì ì ëì± ëšìííê³ ìíížìšìŽì ì ë°ì ìž íì§ì í¥ììí¬ ê²ìŒë¡ êž°ëë©ëë€.
ìë íì ê²°ì ì íì ë°ìë€ìŽê³ , íì êŽëЬì ììŽìë 컎íìŒë¬ê° íë ìŒì íëë¡ ë§¡êž°ììì€. ìŽë¥Œ íµíŽ ì í늬ìŒìŽì ì íµì¬ ë¡ì§ì ì§ì€í ì ìê² ëìŽ ë íšìšì ìŽê³ íšê³Œì ìž ìíížìšìŽ ê°ë°ë¡ ìŽìŽì§ ê²ì ëë€.